﻿#coding=utf-8

class CDataField(object):
    '''可否用于描述数据表中的数据行'''
    def __init__(self, name, cnName='', defVal=''):
        self.name = name
        self.cnName = cnName
        self.defVal = defVal
    
class CDataItem(object):
    pass
    
class ﻿CDataTable(object):

    def __init__(self): 
        if self.__class__ is CDataModel:
            raise NotImplementedError('abstract')
        
        self.m_fieldVals = self.m_fieldDefVals[:]
    
    m_fieldList = []
    m_itemList = []
    @classmethod        
    def appendField(cls, name, cnName='', defVal=''):
        '''TODO - 重构时添加defVal，以便createNew()中使用(cls.m_fieldDefVals)
            TODO - 重构时考虑是否用initFields替代(貌似没有多少必要?)
        '''
        cls.m_fieldNames.append(name)
        cls.m_fieldCNNames.append(cnName)
        cls.m_fieldDefVals.append(defVal)
        return len(cls.m_fieldNames) - 1
        
    @classmethod
    def factory(cls, ):
        '''return  - CDataItem object'''
        pass
    
    def setValue(self, field, val):
        '''设置数据，注意如果view中数据与db中的不一致，需要在此处进行转换'''
        self.m_val[field] = val
        
    def getValue(self, field):
        '''设置数据，注意如果view中数据与db中的不一致，需要在此处进行转换'''
        return self.m_val[field]
    
    listenerList = [] #子类中需要重新定义链表变量，否则会导致父类与子类共享
    @classmethod
    def attachListener(cls, func):
        # 不能使用如下方式，因为链表变量不同于普通变量，是指向内存区域的，
        # 继承而不重新赋值会导致子类、基类指向同一块内存区域，导致共享数据
        # 因此，子类中必须重新定义cls.listenerList = []
        #if 'listenerList' not in dir(cls):
        #    cls.listenerList = []
        cls.listenerList.append(func)
    
    enableNotify = False   
    def notify(self, op=''):
        '''通知listner发生了变化'''
        if not self.enableNotify:
            return
        
        print ('notify', op, self, self.listenerList)
        for item in self.listenerList:
            item(self, op)
            
class ﻿CDataProduct(object):
    f_id = 'id'
    f_name = 'name'
    
    f_key = 'id'
    
    fk_dict = {} #外键设计
    